import { getGroupMsg, getPersonMsg } from '@/utils/getMsgHistory.js';
import { getGroup } from '@/utils/polygonInMap';
const linli = uniCloud.importObject('linliChat', { customUI: true });
import store from '@/store/index.js';
import onekeylogin from './onekeyLongin.js';

// 提取 getUserTelStore 为独立函数（避免作用域问题）
function getUserTelStore() {
  try {
    const userTel = uni.getStorageSync('userTel');
    return userTel;
  } catch (err) {

    return null;
  }
}

function getPushIdStore() {
  try {
    const cid = uni.getStorageSync('push_cid');
    return cid;
  } catch (err) {

    return null;
  }
}

export default function start() {
  return new Promise(async (resolve, reject) => {
    // 检查是否已初始化完成（修复拼写错误：readStata → readState）
    if (
      store.state.msg.user && Object.keys(store.state.msg.user).length > 0 &&
      store.state.msg.isLocationRunning && 
      store.state.msg.ws.readState === 1 // 修正拼写
    ) {
      resolve({ login: true });
      return;
    }

    try {
      // 1. 获取用户手机号（改用 let 允许重新赋值）
      let userTel = getUserTelStore(); // const → let
      if (!userTel) {
        const result = await onekeylogin();
        if (!result || !result.userTel) { // 严谨校验：确保有 userTel
          return reject(new Error('未获取到用户手机号，已跳转登录页'));
        }
        userTel = result.userTel; // 现在可以正常赋值
      }

      // 2. 获取推送CID（改用 let 允许重新赋值）
      let cid = getPushIdStore(); // const → let
      if (!cid) {
        const pushResult = await uni.getPushClientId();
        cid = pushResult[1]?.cid;
        if (!cid) {
          throw new Error('获取推送CID失败');
        }
        // 建议：将获取到的cid存入缓存，避免下次重复获取
        uni.setStorageSync('push_cid', cid);
      }
     
      // 3. 获取用户信息
      const res = await linli.getUserFromDb(userTel, cid);

	  
      if (!res || !res.user) {
        throw new Error('用户信息为空');
      }
      if (!res.user.userId) {
        throw new Error('用户缺少userId');
      }

      // 4. 存储用户信息到 Vuex
      store.commit('msg/SET_user', res.user);
      store.commit('msg/SET_stateConfig', res.user.stateConfig);
      
      // 5. 获取用户位置
      const location = await store.dispatch('msg/getLocation');
 
      if (!location) {
        throw new Error('获取用户位置失败');
      }

      // 6. 连接 WebSocket（等待连接成功）
      const isWsConnected = await store.dispatch('msg/connectWebSocket', {
        location,
        userTel
      });
      if (!isWsConnected) {
        throw new Error('WebSocket 连接失败');
      }

      // 7. 绑定设备到用户（等待完成）
      await getApp().bindDeviceToUser(res.user.userId); // 增加 await

      // 8. 获取群组信息（若为异步，等待完成）
      await getGroup(location); // 增加 await

      // 9. 拉取历史消息（等待完成，确保首页能读到数据）
      await getGroupMsg(res.user); // 增加 await
      await getPersonMsg(res.user); // 增加 await

      resolve({ login: true });

    } catch (e) {
      const errorMsg = '初始化失败：' + e.message;
      console.error(errorMsg, e);
      uni.showToast({
        title: errorMsg,
        icon: 'none',
        duration: 3000
      });
      reject({ login: false, errMsg: e });
    }
  });
}
